本发明总地提供了用于将寄存器从具有更多寄存器的系统映射到具有更少寄存器的系统的系统和方法。可以形成包括具有相对频繁寄存器访问的一个或多个代码块的区。最频繁访问的源寄存器可以被映射到目标寄存器。可以用起始程序和至少一个收尾程序来对所述区中的每一个块限界。所述起始程序可以被配置为实现寄存器映射,所述收尾程序可以被配置为管理从区中的一个块到区中的另一个块或到不在区中的块的程序流。
1.一种用于映射寄存器的方法,包括:加载源二进制应用程序,所述源二进制应用程序包括供计算机系统执行的多个源二进制代码块,所述计算机系统包括存储器和处理单元,所述处理单元包括N
t个目标寄存器,其中,所述源二进制应用程序被配置为在具有N
s个源寄存器的环境中执行,其中N
t小于N
s;在所述源二进制应用程序的运行时期间识别所述源二进制应用程序中频繁执行的源二进制代码块;定义包括所述频繁执行的源二进制代码块和超过相似性阈值的至少一个相邻源二进制代码块的区,其中,相似性对应于所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块在执行可能性上的相关性,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块均包括访问至少一个源寄存器的指令,其中,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块分别用分支指令限界;确定在所述区中访问的每一个源寄存器的访问频率;以及将N个在所述区中最频繁访问的源寄存器中的每一个源寄存器映射到所述N
t个目标寄存器中相应的一个目标寄存器,其中N小于或等于N
t。
2.根据权利要求1所述的方法,还包括至少部分地基于所述寄存器映射来生成对应于所述区中每一个源二进制代码块的优化后的目标二进制代码块,其中,每一个优化后的目标二进制代码块包括起始程序、主体、条件跳转和至少一个收尾程序,所述起始程序被配置为从存储器将与每一个映射的源寄存器相关联的数据加载到对应的目标寄存器,所述主体包括对应于所述源二进制代码块的变换后的源二进制代码,所述条件跳转和所述至少一个收尾程序被配置为至少部分地基于第二目标二进制代码块是否在所述区中来控制从所述区中的第一优化后的目标二进制代码块到所述第二目标二进制代码块的流。
3.根据权利要求2所述的方法,其中,所述至少一个收尾程序包括第一收尾程序和第二收尾程序,所述第一收尾程序被配置为在所述第二目标二进制代码块是在所述区中的第二优化后的目标二进制代码块的情况下被执行,所述第一收尾程序包括用于跳转到所述第二优化后的目标二进制代码块的主体的第一指令,而所述第二收尾程序被配置为在所述第二目标二进制代码块不在所述区中的情况下被执行,所述第二收尾程序包括用于将对应于相应映射的源寄存器的每一个目标寄存器存储到存储器中的第二指令,和用于跳转到所述第二目标二进制代码块的开头的第三指令。
4.根据权利要求1所述的方法,还包括识别用于所述区的生命期内寄存器和生命期外寄存器,所述识别用于所述区的生命期内寄存器和生命期外寄存器包括:识别用于所述区中的每一个源二进制代码块的生命期内寄存器和生命期外寄存器。
5.根据权利要求4所述的方法,还包括至少部分地基于所述寄存器映射来生成对应于所述区中的每一个源二进制代码块的优化后的目标二进制代码块,其中,每一个优化后的目标二进制代码块包括起始程序、主体、条件跳转和至少一个收尾程序,所述起始程序被配置为从存储器将与每一个映射的生命期内源寄存器相关联的数据加载到对应的目标寄存器,所述主体包括对应于所述源二进制代码块的变换后的源二进制代码,所述条件跳转和所述至少一个收尾程序被配置为至少部分地基于第二目标二进制代码块是否在所述区中来控制从所述区中的第一优化后的目标二进制代码块到所述第二目标二进制代码块的流。
6.根据权利要求2所述的方法,还包括:执行所述区中的第一优化后的目标二进制代码块的起始程序,所述执行包括向N个目标寄存器中的每一个目标寄存器加载与用于所述区的N个映射的源寄存器中相应一个源寄存器对应的数据;执行所述第一优化后的目标二进制代码块的主体,所述第一优化后的目标二进制代码块包括被配置为跳转到第二目标二进制代码块的第一分支指令;确定所述第二目标二进制代码块是否在所述区中;以及如果所述第二目标二进制代码块在所述区中,那么执行第一收尾程序以跳转到对应于所述第二目标二进制代码块的第二优化后的目标代码块的主体,或如果所述第二目标二进制代码块不在所述区中,那么执行第二收尾程序以跳转到所述第二目标二进制代码块的开头。
7.根据权利要求5所述的方法,还包括:执行所述区中的第一优化后的目标二进制代码块的起始程序,所述执行包括:对于所述区中的每一个映射的生命期内源寄存器,从存储器向一个目标寄存器加载对应于所述映射的生命期内源寄存器的数据;执行所述第一优化后的目标二进制代码块的主体,所述第一优化后的目标二进制代码块包括被配置为跳转到第二目标二进制代码块的第一分支指令;确定所述第二目标二进制代码块是否在所述区中;以及如果所述第二目标二进制代码块在所述区中,那么执行第一收尾程序以跳转到所述第二目标二进制代码块的主体,或如果所述第二目标二进制代码块不在所述区中,那么执行第二收尾程序以将用于所述区的映射的生命期外寄存器存储在存储器中并且跳转到所述第二目标二进制代码块的开头。
8.一种用于映射寄存器的装置,包括:用于加载源二进制应用程序的模块,所述源二进制应用程序包括供计算机系统执行的多个源二进制代码块,所述计算机系统包括存储器和处理单元,所述处理单元包括N
t个目标寄存器,其中,所述源二进制应用程序被配置为在具有N
s个源寄存器的环境中执行,其中N
t小于N
s;用于在所述源二进制应用程序的运行时期间识别所述源二进制应用程序中频繁执行的源二进制代码块的模块;用于定义包括所述频繁执行的源二进制代码块和超过相似性阈值的至少一个相邻源二进制代码块的区的模块,其中相似性对应于所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块在执行可能性上的相关性,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块均包括访问至少一个源寄存器的指令,其中所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块分别用分支指令限界;用于确定在所述区中访问的每一个源寄存器的访问频率的模块;以及用于将N个在所述区中最频繁访问的源寄存器中的每一个源寄存器映射到所述N
t个目标寄存器中相应的一个目标寄存器的模块,其中N小于或等于N
t。
9.根据权利要求8所述的装置,还包括:用于至少部分地基于所述寄存器映射来生成对应于所述区中每一个源二进制代码块的优化后的目标二进制代码块的模块,其中,每一个优化后的目标二进制代码块包括起始程序、主体、条件跳转和至少一个收尾程序,所述起始程序被配置为从存储器将与每一个映射的源寄存器相关联的数据加载到对应的目标寄存器,所述主体包括对应于所述源二进制代码块的变换后的源二进制代码,所述条件跳转和所述至少一个收尾程序被配置为至少部分地基于第二目标二进制代码块是否在所述区中来控制从所述区中的第一优化后的目标二进制代码块到所述第二目标二进制代码块的流。
10.根据权利要求9所述的装置,其中,所述至少一个收尾程序包括第一收尾程序和第二收尾程序,所述第一收尾程序被配置为在所述第二目标二进制代码块是在所述区中的第二优化后的目标二进制代码块的情况下被执行,所述第一收尾程序包括用于跳转到所述第二优化后的目标二进制代码块的主体的第一指令,而所述第二收尾程序被配置为在所述第二目标二进制代码块不在所述区中的情况下被执行,所述第二收尾程序包括用于将对应于相应映射的源寄存器的每一个目标寄存器存储到存储器中的第二指令,和用于跳转到所述第二目标二进制代码块的开头的第三指令。
11.根据权利要求8所述的装置,还包括:用于识别用于所述区的生命期内寄存器和生命期外寄存器的模块,所述识别用于所述区的生命期内寄存器和生命期外寄存器包括:识别用于所述区中的每一个源二进制代码块的生命期内寄存器和生命期外寄存器。
12.根据权利要求11所述的装置,还包括:用于至少部分地基于所述寄存器映射来生成对应于所述区中的每一个源二进制代码块的优化后的目标二进制代码块的模块,其中,每一个优化后的目标二进制代码块包括起始程序、主体、条件跳转和至少一个收尾程序,所述起始程序被配置为从存储器将与每一个映射的生命期内源寄存器相关联的数据加载到对应的目标寄存器,所述主体包括对应于所述源二进制代码块的变换后的源二进制代码,所述条件跳转和所述至少一个收尾程序被配置为至少部分地基于第二目标二进制代码块是否在所述区中来控制从所述区中的第一优化后的目标二进制代码块到所述第二目标二进制代码块的流。
13.根据权利要求9所述的装置,还包括:用于执行所述区中的第一优化后的目标二进制代码块的起始程序的模块,所述执行包括向N个目标寄存器中的每一个目标寄存器加载与用于所述区的N个映射的源寄存器中相应一个源寄存器对应的数据;用于执行所述第一优化后的目标二进制代码块的主体的模块,所述第一优化后的目标二进制代码块包括被配置为跳转到第二目标二进制代码块的第一分支指令;用于确定所述第二目标二进制代码块是否在所述区中的模块;以及用于执行以下操作的模块,如果所述第二目标二进制代码块在所述区中,那么执行第一收尾程序以跳转到对应于所述第二目标二进制代码块的第二优化后的目标代码块的主体,或如果所述第二目标二进制代码块不在所述区中,那么执行第二收尾程序以跳转到所述第二目标二进制代码块的开头。
14.根据权利要求12所述的装置,还包括:用于执行所述区中的第一优化后的目标二进制代码块的起始程序的模块,所述执行包括:对于所述区中的每一个映射的生命期内源寄存器,从存储器向一个目标寄存器加载对应于所述映射的生命期内源寄存器的数据;用于执行所述第一优化后的目标二进制代码块的主体的模块,所述第一优化后的目标二进制代码块包括被配置为跳转到第二目标二进制代码块的第一分支指令;用于确定所述第二目标二进制代码块是否在所述区中的模块;以及用于执行以下操作的模块,如果所述第二目标二进制代码块在所述区中,那么执行第一收尾程序以跳转到所述第二目标二进制代码块的主体,或如果所述第二目标二进制代码块不在所述区中,那么执行第二收尾程序以将用于所述区的映射的生命期外寄存器存储在存储器中并且跳转到所述第二目标二进制代码块的开头。
技术领域本公开涉及动态二进制变换,并且更具体地说,涉及用于执行从具有更多寄存器的指令集架构(“ISA”)到具有更少寄存器的ISA的动态二进制变换的有效技术。
背景技术动态二进制变换(DBT)已经被广泛地用作使针对一个指令集架构(ISA)创建的应用程序运行在不同ISA之上的手段。考虑到针对基于x86ISA的PC开发的传统软件的量,已经关注于将x86变换到其他ISA。更小的超移动PC和更强大的嵌入式与移动互联网设备(例如,智能电话)二个行业中近来的趋势正在使这些不同市场之间的边界变得模糊。因此,这种市场融合引起了对于从当前主导嵌入式和移动互联网设备市场的ISA(例如,ARM(ARM控股公司)、MIPS(MIPS技术公司)和PowerPC(Apple-IBM-Motorola联盟))到x86(英特尔公司)的DBT的极大兴趣。二进制变换(“BT”)是用于将针对一个源(“来宾”)ISA构建的二进制变换到另一个目标(“主机”)ISA的通用技术。使用BT,有可能使针对一个处理器ISA构建的应用程序二进制在具有不同架构的处理器上执行,而不需要重新编译高级源代码或重写汇编代码。因为大部分传统计算机应用程序仅在二进制格式下可用,所以BT是非常有吸引力的,因为它有可能允许处理器执行不是针对该处理器构建并且该处理器不可用的应用程序。在过去的几十年里,若干成功的BT项目已经推进了该领域的发展,这些项目包括数字设备公司(Digitalxa0Equipmentxa0Corporation)(“DEC”)的FX!32、英特尔的IA-32EL、Transme
ta的CMS(“代码变形软件”(Codexa0Morphingxa0Software))、Godson-3(MIPS架构)以及IBM的DAISY(来自约克镇的动态架构的指令集(Dynamicallyxa0Architectedxa0Instructionxa0Setxa0fromxa0Yorktown))。这些工具中的大部分目的在于在诸如Alpha(DEC)、Itanium(英特尔)、Crusoe(Transme
ta)和MIPS(MIPS技术公司)的处理器上运行传统的x86应用程序。上文提到的工具中大部分使用动态BT(DBT),意味着它们在执行应用程序时(即,在运行时)即时执行变换。可替换地,可以脱机地执行BT,即,静态BT(SBT)。动态使用模式通常是优选的,因为它更通用(例如,能够处理自我修改代码)并且它对于用户透明地工作,其中仅有简单的OS改变以自动地针对非原生二进制调用DBT。与SBT相比,DBT的主要缺点是开销。对应用程序进行变换和优化所花费的周期是原本可以用来实际执行应用程序代码的周期。因此,DBT工具面临在变换/优化上花费时间和产生的代码质量之间的权衡,所述产生的代码质量又反映在变换后的代码的执行时间上。DBT面临的挑战是高度依赖于源和目标ISA。近年来,人们对将x86ISA的使用扩展到超移动和嵌入式细分市场(例如,英特尔的Atom处理器)有极大的兴趣。从用户的角度来看,这会带来很大的便利,因为它可以使得传统PC软件能够在嵌入式和超移动平台上有效地运行。然而,对于在这些新领域中要采用的x86,还必须使得x86能够执行在这些细分中可用的大量软件库,所述软件库主要基本ARM(ARM控股公司)、MIPS(MIPS技术公司)和PowerPC(Apple-IBM-Motorola联盟)ISA。例如,在未来基于x86的智能电话中,除了潜在地运行PC应用程序之外,能够下载和无缝地运行来自例如苹果公司的iPhone应用商店的基于ARM的应用程序将是有益的。实现该场景的挑战包括保持DBT的性能和低的能量开销。尽管已经提出了各种DBT系统,但是它们的大部分遵循相同的基本执行流程。首先,将针对源(来宾)架构创建的二进制文件加载到存储器中。然后将该源二进制的部分变换成目标(主机)二进制代码。该变换通常是“按需”完成的。换言之,源代码指令在控制流到达它们时被变换。通常,以基本块的粒度执行该变换,所述基本块是具有单个入口并可能具有多个出口的指令序列。在一个基本块被变换后,将该变换保存在存储器的变换高速缓存(还称为代码高速缓存)中以供未来重用。最积极的DBT系统执行不同级别的优化。遵循Transme
ta的CMS和其他DBT系统,这些优化级别被称为“档”(gear)。首先,使用非常迅速的变换(1档)。该档目标是非常快的进行操作,但是以变换后的代码的低质量为代价。该权衡对于很少执行的代码(例如OS引导代码)来说常常是理想的。在1档,DBT还实现探针(计数器)来检测“热点”(即,频繁执行的)基本块。一旦一个块成为热点,那么将它及其相关的周围块合并成一个区。然后,用更高的档来对该区进行重新变换,所述更高的档将额外的优化应用于代码。可以针对任意数量的档重复该相同的策略。例如,Transme
ta的CMS使用四个档。实际上,基于档的系统确保:代码区为总的运行时间贡献得越多,对它进行优化以产生更快的代码所花费的时间越多。所应用的优化的集合、数量和积极性从一个DBT到另一个DBT有着很大的变化。通常的优化包括:指令调度、死代码消除和冗余消除。实际上,类似于静态编译器优化,大部分相关优化的集合依赖于目标架构。但是与编译器优化相比,在DBT中,这些优化具有精确的运行时信息,这些运行时信息可以用来获取更高质量的代码。与静态编译器相比,DBT的主要劣势是紧得多的优化时间预算。
附图说明所要求保护的主题的特征和优点根据下面对与其相应的实施例的详细描述将会变得显而易见,其中这些描述应当参考附图来考虑,在附图中:图1描述了根据本公开的存储器系统;图2A描述了根据本公开的动态二进制变换器的例示性操作的流程图;图2B描述了根据本公开的用于对代码进行优化的例示性操作的流程图;图3描述了包括频繁执行的代码块的区的例示性控制流图;图4描述了根据本公开的例示性优化后的目标二进制代码块,包括起始程序、主体、条件跳转和至少一个收尾程序;图5描述了根据本公开的用于执行目标二进制代码块的例示性操作的流程图,其中,所述例示性操作包括优化;图6描述了对应于图3的控制流图的例示性优化后的控制流图;以及图7说明了根据本公开的包括块级寄存器映射和区级寄存器映射的动态二进制变换的性能基准的比较。
具体实施方式动态二进制变换(“DBT”)面临的挑战是它带来的开销。该开销主要来自于来宾(“源”)-ISA中不容易映射到主机(“目标”)-ISA的、相对频繁使用的特征。例如,当源-ISA具有比目标-ISA更大的寄存器集时,使用从源寄存器到目标寄存器的有效寄存器映射以便减少寄存器模仿(emulation)开销(例如存储器访问)是重要的。这对于诸如x86和x86-64的目标-ISA尤其重要,与例如具有32个寄存器的PowerPC、ARM和MIPS以及具有128个寄存器的Itanium的其他ISA相比较,诸如x86和x86-64的目标-ISA具有相对少量的通用/整数寄存器(例如,8和16个)。最优映射(即,产生最小开销的映射)高度依赖于源二进制代码序列,并且因此从代码的一部分到另一部分而变化的事实加重了寄存器映射问题。理想情况下,每一个代码区应当使用对其最优的寄存器映射。本公开提供了被配置为提供区级寄存器映射的系统和方法。该方法包括:对于区中的每一个二进制代码块,将该区中最频繁访问的源处理器寄存器的至少一些映射到目标处理器寄存器。可以根据与对应于源二进制代码块的目标二进制代码块一起实现的包括计数器的探针(probe)来确定最频繁访问的源处理器寄存器。然后,可以针对该区中被选择来进行优化的每一个源二进制代码块生成优化后的目标二进制代码块。优化后的目标二进制代码块可以包括起始程序、包括变换后的源二进制代码的主体、条件跳转和至少一个收尾程序。起始程序被配置为加载用于该区的映射的寄存器或映射的生命期内(live-in)寄存器。条件跳转被配置为基于在源二进制代码块的边界的分支是去往该区中的下一个二进制块还是去往不在该区中的下一个二进制块来对流进行控制。收尾程序被配置为如果下一个二进制块是在该区中则跳转到块主体,或如果下一个二进制块不在该区中则跳转到该下一个二进制块的开头。开头可以对应于另一个区中优化后的目标二进制代码块的起始程序或未优化的目标二进制代码块。如果下一个二进制块不在该区中,那么可以将用于该区的生命期外(live-out)寄存器存储在存储器中。有利地,可以通过在跨越区边界时而非每次执行优化后的目标二进制代码块时加载用于该区的映射的寄存器或映射的生命期内寄存器来减少存储器访问。根据本公开的方法和/或系统被配置为提供区级寄存器映射。区可能相对复杂。例如,如本领域中的技术人员将理解的,区可以包括任意循环嵌套,即循环的任意组合,例如,父循环内有多个兄弟。在另一示例中,区可以包括对应于不可约流图的目标二进制代码块,例如进入一个循环有多个可能的入口。区可以由连续的和/或不连续的目标二进制代码块形成。图1描述了根据本公开的系统100。系统100包括耦合到系统存储器104的处理器(“CPU”)102。系统100可以包括高速缓冲存储器105(其可以与系统存储器104包括在一起)和/或类似于高速缓冲存储器但是由软件管理的高速暂存存储器107。CPUxa0102可以包括多个处理器寄存器106-1、106-2......106-m,统称为106。CPUxa0102可以包括多个核心处理单元(下文中的“多个核心”或单数的“核心”),并且每一个核心可以被配置为执行多个线程。系统存储器104可以容纳(host)源二进制应用程序110、动态二进制变换系统115和主机操作系统(“OS”)120。动态二进制变换系统115可以包括目标二进制代码块112、包括寄存器映射模块116的动态二进制变换器代码114和/或源寄存器储存器118。源二进制应用程序110可以包括对应于源ISA的多个源二进制代码块。目标二进制代码块对应于目标ISA。源二进制代码块是包括例如具有分支指令的结尾的一个或多个指令的序列。目标二进制代码块被配置为包括对应源二进制代码块的功能性。优化后的目标二进制代码块可以在该优化后的目标二进制代码块的主体中包括对应源二进制代码块的功能性。如本文中描述的,优化后的目标二进制代码块可以包括额外的功能性。可以将目标二进制代码块112存储在系统存储器的称为“代码高速缓存”111的区域中。代码高速缓存111可以理解为用于目标二进制代码块112(即已经从一个或多个对应源二进制代码块变换来的一个或多个目标二进制代码块112)的储存器。系统存储器104可以容纳被配置为加载/存储至/来自处理器寄存器106的数据的源寄存器储存器118。在一些实施例中,高速缓冲存储器105和/或高速暂存存储器107被配置为加载/存储至/来自处理器寄存器106的数据。可以由一个或多个核心执行动态二进制变换器代码114和寄存器映射模块116,以对源二进制应用程序110进行操作来将源二进制应用程序110的块转换成目标二进制代码块112。可以动态地将源二进制代码块变换成目标二进制代码块。换言之,可以响应于对执行二进制块的调用而非静态地(即在运行时之前)将源二进制代码块变换成目标二进制代码块。然后可以将目标二进制代码块存储在系统存储器104中的代码高速缓存111内并且提供给CPUxa0102以供执行。将源二进制代码110的块转换为目标二进制代码块112可以包括:至少部分地基于针对区的寄存器访问频率来将一个或多个源寄存器映射到一个或多个目标寄存器,例如处理器寄存器106。例如,源-ISA可以包括N
s个源寄存器,目标-ISA可以包括N
t个目标寄存器,例如寄存器106,其中N
t小于N
s。图2A描述了动态二进制变换器的流程图200。可以由动态二进制变换器代码114执行流程图200的操作。程序流可以从接收对执行二进制代码块的调用202开始。假设在对执行二进制代码块的调用202之前,源二进制应用程序110已经被加载到系统存储器104中。在操作204,可以确定一个或多个目标二进制代码块是否在代码高速缓存(例如代码高速缓存111)中。每一个目标二进制代码块对应于源二进制应用程序110的源二进制代码块。如果目标二进制代码块不在代码高速缓存中,那么操作206可以包括:将源二进制代码块变换成目标二进制块,实现探针并且将该目标二进制块和该探针存储在代码高速缓存中。该变换可以被配置为相对很快。例如,探针可以包括计数器,所述计数器被配置为维持对执行二进制块的次数的计数。源处理器寄存器可以被映射到诸如系统存储器104中的源寄存器储存器118的寄存器储存器、高速缓冲存储器105和/或高速暂存存储器107。然后,程序流可以进行到操作211。在操作211,可以执行变换后的代码块。如果在操作204目标二进制代码块在代码高速缓存中,那么程序流可以进行到操作208。在操作208,可以确定是否已经达到阈值。可以至少部分地基于响应于先前对执行代码块的调用而在操作206实现的探针来确定是否已经达到阈值。例如,可以在每次执行二进制块时递增计数。如果该计数已经达到预定阈值,那么探针可以被配置为将程序流返回(即,分支)到动态二进制变换器以进行进一步的处理。预定阈值可以被配置为指示可以受益于优化的相对频繁执行的二进制块。如果还没有达到阈值,那么程序流可以进行到操作211,执行变换后的代码块。如果达到了阈值,那么程序流可以进行到操作210,对代码进行优化。如本文中所描述的,对代码进行优化210被配置为包括区形成和寄存器映射。然后,程序流可以进行到操作211,执行变换后的代码块。图2B描述了根据本公开的用于对代码进行优化的流程图210。程序流可以在开始212开始。可以由包括寄存器映射模块116的动态二进制变换器代码114来执行流程图210的操作。在操作214,可以进行搜索以寻找达到和/或超过相似性阈值的相邻二进制块。相邻二进制块可以与触发了代码优化的二进制块相关。例如,相邻二进制块可以被配置为正好在触发了代码优化的二进制块之前或之后被执行。相邻二进制可以是与进行触发的二进制块连续的和/或可以通过分支或跳转与进行触发的二进制块相关。二进制块之间或之中的相似性可以被理解为在二进制块的执行可能性上的相关性。例如,该相关性可以是由于从一个二进制块分支到另一个二进制块。然后,在操作216,可以形成包括达到和/或超过相似性阈值的相邻二进制块的区。在操作218,可以为在该区中被访问的每一个源寄存器确定访问的次数。区中的指令可以使用(即,读取)源寄存器,和/或可以定义(即,写入)源寄存器。寄存器访问(即,寄存器使用)包括使用和/或定义寄存器。寄存器映射可以基于区中对每一个源寄存器的访问的总次数。例如,在操作216形成的区可以包括一个或多个二进制代码块。包括对二进制块的执行次数的计数的探针可以与每一个二进制代码块相关联。对于每一个二进制块,可以基于该对二进制块的执行次数的计数、二进制块中的指令和由每一个指令访问的寄存器来确定寄存器访问的次数。然后,可以通过对区的每一个二进制块中针对每一个寄存器的访问次数进行求和来确定在该区中被访问的每一个寄存器的访问总次数。图3描述了包括代码的例示性区305的例示性控制流图300。控制流图300包括五个代码块:块Axa0310、块Bxa0320、块Cxa0330、块Dxa0340和块Exa0350。每一个块具有对应于块的执行次数的相关联计数312、322、332、342、352,这些计数是基于例如在操作206(图2A)实现的探针而确定的。例如,块A、块C和块E分别具有相关联计数10,块B具有相关联计数1000以及块D具有相关联计数990。在该示例中,块B可能已经达到关于图2A的操作208所描述的预定阈值,即,块B是频繁执行的源二进制代码块。块A、块C和块D可以是相对于块B的相邻块。图2B的操作214,搜索达到/超过相似性阈值的相邻块可以产生块D。块D是相对于块B达到或超过相似性阈值的相邻源二进制代码块。相似性对应于频繁执行的源二进制代码块和相邻源二进制代码块在执行可能性上的相关性。换言之,块B具有相对高的执行可能性(计数=1000)。块D也具有相对高的执行可能性(计数=990)。使用“执行可能性”是因为计数信息是历史的并且未来执行的频率可能改变。块D的执行可能性是例如基于块B和块D之间的分支而与块B的执行可能性相关的。换言之,块D的执行可能性与块B的执行可能性是互相关的。在具有五个代码块的该示例中,分别具有为1000和990的相对较高执行频率(即,计数)并且达到或超过相似性阈值的块B和块D被包括在区305中。块B中的指令访问寄存器r1、r2、r3、r4和r5。寄存器r1和r4被定义(写入)并且寄存器r1、r2、r3、r4和r4被使用(读取)。换言之,对于块B的每一次执行,r1和r4被访问两次,其余的寄存器被分别访问一次。因此,对于具有执行频率1000的块B,r1和r4分别被访问2000次,其余的寄存器分别被访问1000次。块D包括访问寄存器r2两次(一次读取以及一次写入)和寄存器r5一次(一次读取)的一个指令。因此,对于具有执行频率990的块D,r2被访问1980次,r5被访问900次。因此,对于包括块B和块D的区305,r1总共被访问2000次,r2总共被访问2980次,r3总共被访问1000次,r4总共被访问2000次以及r5总共被访问1990次。按照寄存器访问的次数,从最频繁访问到最不频繁访问对寄存器进行排序,得出:r2、r1和r4、r5,然后是r3。再次转向图2B,在操作220,源寄存器可以被映射到目标寄存器。可以将对于区而言与最高访问次数相对应的(即,最频繁访问的)源寄存器映射到目标寄存器。例如,目标ISA可以具有N
t个目标处理器寄存器,而源ISA可以具有N
s个源处理器寄存器,其中N
t小于N
s。在N
t个目标处理器寄存器中,N个可以用于映射,其中N小于或等于N
t。继续图3中所说明的示例,如果N是3,那么对于所述区,寄存器r1、r2和r4可以被映射到目标处理器寄存器。寄存器r3和r5可以不被映射到目标处理器寄存器,并且因此可以在需要时从存储器获取。在一些实施例中,可用于映射的目标处理器寄存器的数量N可以小于目标ISA的处理器寄存器的数量N
t。换言之,可以为例如使用或定义未映射的源寄存器的指令保留一个或多个目标处理器寄存器。例如,可以为这种指令保留一个或两个目标处理器寄存器。表1包括与用于确定区中对每一个源寄存器的寄存器访问总次数和将N个源寄存器映射到N个目标寄存器的一个示例相对应的伪代码。表1
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="500"/>
![]()
ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>因此,在操作220完成时,N个源寄存器可以被映射到N个目标寄存器。没有映射到目标寄存器的源寄存器可以被映射到系统存储器104中的源寄存器储存器118、高速缓冲存储器105和/或高速暂存存储器107。在操作222,可以针对区中的每一个二进制块识别生命期内和/或生命期外寄存器。生命期内对应于在二进制块中被使用(即,读取)而没有首先在二进制块中被定义(即,写入)的寄存器。例如,在图3中说明的区305中,寄存器r2、r3和r5在块B中被使用而没有首先被定义,而寄存器r2在块D中被使用之后被定义。因此,寄存器r2、r3和r5是区305的生命期内寄存器。生命期外对应于其值可能已经被二进制块中的指令改变的寄存器。例如,在区305中,寄存器r1和r4的值可能被块B中的指令改变,而r2的值可能被块D中的指令改变。因此,r1、r2和r4是区305的生命期外寄存器。在一些实施例中,可以不执行操作222,这通过用虚线描绘表示操作222的框来指示。在操作224,对于区(例如,区305)中的每一个二进制块,可以生成优化后的目标二进制代码块。例如,每一个优化后的目标二进制代码块可以包括起始程序、包括对应源二进制代码块的变换后的源代码的块主体和条件跳转以及至少一个收尾程序。图4描述了目标代码块400的示例,所述目标代码块包括起始程序410、块主体420和两个收尾程序430、440。条件跳转包括在块主体420中。起始程序被配置为例如从源寄存器储存器118将与映射的寄存器或映射的生命期内源寄存器相对应的数据加载到目标寄存器。是加载映射的源寄存器还是加载映射的生命期内源寄存器可以取决于开销,即,将与识别用于区中每一个源二进制代码块的生命期内源寄存器相关联的开销和与在进入区时加载所有映射的源寄存器相关联的开销进行比较。例如,对于图3中描述的区305,寄存器r1、r2和r4被映射到用于区305的目标寄存器。因此,在该示例中,分别与块B和块D相关联的每一个起始程序可以被配置为将源寄存器r1、r2和r4从存储器加载到目标寄存器。在另一示例中,对于区305,寄存器r2被映射并且是生命期内。因此,分别与块B和块D相关联的每一个起始程序被配置为加载寄存器r2,从而与加载全部的映射的源寄存器(即,r1、r2和r4)相比导致更少的存储器访问。所述至少一个收尾程序可以包括第一收尾程序和第二收尾程序。条件跳转被配置为基于结束源二进制代码块的分支是去往区中目标二进制代码块还是去往不在区中的目标二进制代码块,来控制流是进行到第一收尾程序还是第二收尾程序。如本文所描述的,区中目标二进制代码块是优化后的目标二进制代码块。不在区中的目标二进制代码块可能是未优化的目标二进制代码块,或者是与另一区相关联的优化后的目标二进制代码块。第一收尾程序包括到区中目标二进制代码块的跳转。例如,再次参考图3,从块B到块D的跳转对应于到区中目标二进制代码块的跳转。第二收尾程序包括到区外部(例如,不在区305中)的目标二进制代码块的跳转。第二收尾程序还被配置为在跳转到下一个目标二进制代码块之前存储生命期外寄存器。类似于本文描述的加载生命期内寄存器,第二收尾程序可以被配置为在跳转到下一个目标二进制代码块之前存储映射的寄存器或映射的生命期外寄存器。再次参考图3,从块B到块C的跳转对应于到在区外部的目标二进制代码块的跳转。到区中目标二进制代码块的跳转被配置为跳转到区中二进制代码块的主体,而绕过与区中二进制代码块相关联的起始程序。到区外目标二进制代码块的跳转被配置为跳转到区外目标二进制代码块的开头。如果区外目标二进制代码块是与另一区相关联的优化后的目标二进制代码块,那么跳转到该优化后的目标二进制代码块的起始程序。可以理解,运行时系统(即,主机操作系统120)被配置为执行可以不是由目标代码直接处理的功能,例如中断处理。为了使这些功能正确地工作,来宾状态处于一致点(即存储器中适当数据结构中的一致来宾状态)是重要的。来宾状态可能在块的执行中不一致但是在块的边界一致。因此,诸如开源QEMU的动态二进制变换器被配置为将中断处理推迟到代码块的结尾。为了在块的结尾具有一致的来宾状态,在跳转到区中的块后并且在返回到运行时系统之前,可以(例如,在源寄存器储存器118中)存储生命期外寄存器。对于到不在区中的块的跳转,可以在跳转到不在区中的块之前存储生命期外寄存器。在跳转到不在区中的块后,控制可以返回到运行时系统。图5描述了用于执行与源二进制应用程序相对应的目标二进制代码块的例示性操作的流程图500,这些目标二进制代码块包括至少一个优化后的代码区,所述至少一个优化后的代码区包括至少一个优化后的目标二进制代码块。程序流可以在开始502开始。开始502对应于进入包括至少一个优化后的目标代码块的第一区的优化后的目标二进制代码。在操作504,可以执行第一区中的第一优化后的目标二进制代码块的起始程序。如本文中所描述的,该起始程序被配置为从存储器加载映射的寄存器或映射的生命期内寄存器。然后,可以在操作506执行第一优化后的目标二进制代码块的主体。可以在操作508确定位于与第一优化后的目标二进制代码块的源二进制代码块的边界处的分支是否去往第一区中的目标二进制代码块。如果该分支去往不在第一区中的目标二进制代码块,那么在操作510可以将映射的寄存器或映射的生命期外寄存器存储在存储器中,例如存储在源寄存器储存器118中。在操作512,可以执行到不在第一区中的下一个目标二进制代码块的开头的跳转。该下一个目标二进制代码块可能被优化或可能未被优化。如果该下一个目标二进制代码块未被优化,那么可以在操作514执行与下一个源二进制代码块相对应的该下一个目标二进制代码块。如果该下一个目标二进制代码块例如在第二区中被优化,那么可以然后在操作504执行(第二区中的该下一个目标二进制代码块的)起始程序,之后在操作506执行该下一个目标二进制代码块的主体。如果在操作508确定分支去往第一区中的目标二进制代码块,那么可以在操作516执行到下一个目标二进制代码块的主体的跳转。在一些实施例中,可以将寄存器存储在存储器中以例如便利由运行时系统进行的中断处理。在这些实施例中,可以在操作517确定是否有必要返回到运行时系统。如果没有必要返回到运行时系统,那么程序流可以进行到操作506,并且然后可以在操作506执行(下一个目标二进制代码块的)主体。如果有必要返回到运行时系统,那么可以在操作518将寄存器存储在存储器中,并且在操作520,程序流可以进行到运行时系统。当从运行时系统返回时,程序流可以进行到操作504,执行起始程序,其中可以从存储器加载寄存器。参考图4和图5,操作508(确定分支是去往在区中的还是不在区中的下一个二进制代码块)对应于优化后的目标二进制代码块的主体420的条件跳转(jCCxa0T)。操作516对应于第一收尾程序430,在区主体内跳转。操作510和512对应于第二收尾程序440。图6描述了对应于图3中描述的示例控制流图300的优化后的控制流图600。在优化后的控制流图600中,目标块Bxa0620对应于图3的控制流图300的块Bxa0320,以及目标块Dxa0640对应于控制流图300的块Dxa0340。根据图4的目标代码块400来配置目标块B和目标块D。优化后的控制流图600中的目标二进制代码块之间的控制流取决于流是在区中的目标二进制代码块之间还是在区中的一个目标二进制代码块和不在区中的一个目标二进制代码块之间。不在区中的目标二进制代码块可以是与另一个区相关联的优化后的目标二进制代码块,或者可以是未优化的目标二进制代码块。例如,从目标块B到区605外部的块C的控制流是从目标块B的收尾程序2(存储映射的寄存器或映射的生命期外寄存器)到块C(即,到块C的开头),而从块C到目标块D的控制流是从块C到目标块D的起始程序(加载映射的寄存器或映射的生命期内寄存器)。都在区605中的目标块B和目标块D之间的控制流是从块B或块D的收尾程序1到块D或块B的主体,分别用路径624和路径642说明。因此,如在优化后的控制流图600中所说明的,起始程序可以仅在进入区中时执行。在区中的目标二进制代码块之间的跳转被配置为跳转到目标二进制代码块的主体,而绕过了起始程序和与加载映射的寄存器或映射的生命期内寄存器相关联的存储器访问。有利地是,这可以为代码的相对频繁执行的区带来性能提高,例如,加快速度。可以为源应用程序生成多个区的优化后的目标二进制代码块。有利地是,针对每一个区优化寄存器映射可以独立于针对其他区优化寄存器映射来进行。以这种方式,优化是特定于区的。在一些实施例中,可以仅在退出区时执行对映射的寄存器或映射的生命期外寄存器的存储,从而进一步增强了性能。图7说明了实现块级寄存器映射710、720、730、740、750和根据本公开的区级寄存器映射715、725、735、745、755的动态二进制变换的性能基准的比较。所述性能是相对于(将寄存器映射到存储器的)开源QEMU动态二进制变换器示出的。在块级寄存器映射中,在进入每一个目标代码块时加载映射的生命期内寄存器,并且在退出每一个目标代码块时存储映射的生命期外寄存器。根据本公开的区级寄存器映射的所说明的实施例被配置为在进入区时(从存储器)加载映射的生命期内寄存器,并且在退出区时(在存储器中)存储生命期外寄存器。对于所有的基准,根据本公开的区级寄存器映射相对于基线(ba
seline)QEMU和块级寄存器映射提高了性能。平均而言,与块级寄存器映射相比,基准的性能提高为大约17%,与QEMU基线相比,大约是31%。因此,根据本公开的方法和系统包括:当具有少于源处理器寄存器的目标处理器寄存器时在动态二进制变换中将源处理器寄存器映射到目标处理器寄存器。对于确定为“热点”(即,相对频繁执行)的代码区,可以确定对每一个源寄存器的访问次数。然后,可以将最频繁访问的源寄存器映射到可用的目标寄存器。对于区中的每一个源二进制代码块,可以生成对应的优化后的目标二进制代码块,该优化后的目标二进制代码块包括起始程序、包括变换后的源代码的主体和条件跳转以及至少一个收尾程序。所述条件跳转和所述至少一个收尾程序被配置为基于分支从第一目标二进制代码块是去往区中的下一个目标二进制代码块还是去往不在区中的下一个目标二进制代码块来控制流。如果下一个目标二进制代码块在区中,那么跳转被引导到该下一个目标二进制代码块的主体,而绕过了起始程序。如果下一个目标二进制代码块不在区中,那么跳转被引导到该下一个目标二进制代码块的开头。起始程序被配置为从存储器加载用于区的映射的寄存器或映射的生命期内寄存器。如果下一个目标二进制代码块不在区中,那么收尾程序被配置为在跳转到该下一个目标二进制代码块的开头之前存储映射的寄存器或映射的生命期外寄存器。以该方式,在进入区时从存储器加载映射的寄存器或映射的生命期内寄存器,并且在退出区时将映射的寄存器或映射的生命期外寄存器存储到存储器中,从而与块级寄存器加载/存储相比减少了存储器访问。如本文所描述的,优化依赖于与目标二进制代码块一起插入的包括计数器的探针。因此,基于计数器确定的执行频率表示有限时间段。如果代码区的执行频率随着时间而改变,那么通过优化初始提供的性能提高可能降低,即,可能变为次最优。尽管可以重复优化,但是是否重复如本文中所描述的过程可以取决于对实现优化的时间与执行先前优化的目标二进制代码块的时间的比较的考虑。当然,虽然图2A、2B和5描述了根据一些实施例的例示性的操作,但是应当理解,在其他实施例中,图2A、图2B和/或图5中描述的所有操作可能不是必须的。实际上,本文充分考虑了本公开的其他实施例可以包括图2A、图2B和/或图5中描述的操作的子组合和/或额外的操作。因此,涉及没有在一个附图中精确示出的特征和/或操作的权利要求被认为在本公开的范围和内容内。存储器104、高速缓冲存储器105和/或高速暂存存储器107可以包括以下类型的存储器中的一种或多种:半导体固件存储器、可编程存储器、非易失性存储器、只读存储器、电可编程存储器、随机存取存储器、闪速存储器、磁盘存储器和/或光盘存储器。附加地或可替换地,存储器104、高速缓冲存储器105和/或高速暂存存储器107可以包括其他的和/或以后开发出的类型的计算机可读存储器。可以使用处理器和/或其他的可编程设备来实现本文描述的方法的实施例。为此,可以在其上存储有指令的有形计算机可读介质上实现本文描述的方法,所述指令在由一个或多个处理器执行时执行所述方法。存储介质可以包括任何类型的有形介质,例如:任何类型的盘,包括软盘、光学盘、光盘只读存储器(CD-ROM)、可重写光盘(CD-RW)和磁光盘;半导体器件,诸如只读存储器(ROM)、随机存取存储器(RAM)(诸如动态和静态RAM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、闪速存储器、磁卡或光卡;或适于存储电子指令的任何类型的介质。若非具体声明另有所指,否则如从前面的讨论中显而易见的是,应当意识到,在本说明书的讨论中通篇对诸如“操作”、“处理”、“计算”、“运算”、“确定”等等术语的使用是指计算机或计算系统或类似的电子计算设备或装置的动作和/或过程,其将计算系统的寄存器和/或存储器中被表示为物理量(例如,电子)的数据操作和/或转换为计算系统的存储器、寄存器或其它此类信息存储、传输或显示设备中被类似地表示为物理量的其它数据。如本文中的任意实施例所使用的,“电路”可以例如单独地或以任何组合的方式包括硬连线电路、可编程电路、状态机电路和/或存储由可编程电路执行的指令的固件。根据一个方面,公开了一种方法。该方法可以包括加载源二进制应用程序,该源二进制应用程序包括供计算机系统执行的多个源二进制代码块。计算机系统可以包括存储器和处理单元,所述处理单元包括N
t个目标寄存器,其中N
t小于在对应源指令集架构中的源寄存器的数量N
s。该方法还可以包括:在源二进制应用程序的运行时期间识别该源二进制应用程序中频繁执行的源二进制代码块;定义包括所述频繁执行的源二进制代码块和超过相似性阈值的至少一个相邻源二进制代码块的区,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块包括对至少一个源寄存器的访问并且分别通过分支指令限界。该方法还可以包括:确定在所述区中访问的每一个源寄存器的访问频率;将N个在所述区中最频繁访问的源寄存器中的每一个源寄存器映射到所述N
t个目标寄存器中相应的一个目标寄存器,其中N小于或等于N
t;以及至少部分地基于寄存器映射来生成对应于所述区中每一个源二进制代码块的优化后的目标二进制代码块。根据另一方面,公开了一种制品,包括在其上存储有指令的有形存储介质,所述指令当由处理器执行时可以使得进行以下操作:加载源二进制应用程序,该源二进制应用程序包括供执行的多个源二进制代码块,其中所述处理器包括N
t个目标寄存器,其中N
t小于在对应源指令集架构中的源寄存器的数量N
s;在所述源二进制应用程序的运行时期间识别所述源二进制应用程序中频繁执行的源二进制代码块;定义包括所述频繁执行的源二进制代码块和超过相似性阈值的至少一个相邻源二进制代码块的区,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块包括对至少一个源寄存器的访问并且分别通过分支指令限界;确定在所述区中访问的每一个源寄存器的访问频率;将N个在所述区中最频繁访问的源寄存器中的每一个源寄存器映射到所述N
t个目标寄存器中相应的一个目标寄存器,其中N小于或等于N
t;以及至少部分地基于寄存器映射来生成对应于所述区中每一个源二进制代码块的优化后的目标二进制代码块。在另一个方面,公开了一种系统。该系统可以包括:处理器,其包括N
t个目标寄存器,其中N
t小于在对应源指令集架构中的源寄存器的数量N
s;以及存储器,其被配置为容纳动态二进制变换器、寄存器映射模块和源二进制应用程序,所述源二进制应用程序包括要在所述处理器上执行的多个源二进制代码块,其中,当在所述处理器上执行所述动态二进制变换器和所述寄存器映射模块时,所述动态二进制变换器和所述寄存器映射模块中的至少一个可以使得所述处理器:在所述源二进制应用程序的运行时期间识别所述源二进制应用程序中频繁执行的源二进制代码块;定义包括所述频繁执行的源二进制代码块和超过相似性阈值的至少一个相邻源二进制代码块的区,所述频繁执行的源二进制代码块和所述至少一个相邻源二进制代码块包括对至少一个源寄存器的访问并且分别通过分支指令限界;确定在所述区中访问的每一个源寄存器的访问频率;将N个在所述区中最频繁访问的源寄存器中的每一个源寄存器映射到所述N
t个目标寄存器中相应的一个目标寄存器,其中N小于或等于N
t;以及至少部分地基于寄存器映射来生成对应于所述区中每一个源二进制代码块的优化后的目标二进制代码块。已经在本文中使用的术语和表达被用作描述性而非限制性的术语,并且在使用这些术语和表达时并不意图排除示出和描述的特征(或其部分)的任何等同物,并且应当认识到,在权利要求范围内的各种修改是可能的。因此,权利要求意图覆盖所有此类等同物。